package comunicacao;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Iterator;

import controle.ControladorGUI;

public class ClienteTCP implements Comunicacao {
	private Socket socket;
	private ThreadReceberMensagem threadCliente;
	private ControladorGUI ctrl;
	
	public ClienteTCP(String ipServidor, int port, ControladorGUI controladorGUI) throws IOException {
		this.socket = new Socket(ipServidor, port);
		this.threadCliente = new ThreadReceberMensagem(socket, this);
		this.threadCliente.start();
		this.ctrl = controladorGUI;
	}
	
	@Override
	public void enviar(Mensagem mensagem) throws DestinoDesconhecidoException, IOException {
		ObjectOutputStream output;
		output = new ObjectOutputStream(this.socket.getOutputStream());
		output.writeObject(mensagem);
	}
	
	@Override
	public void receber(Mensagem mensagem) {
		if(mensagem instanceof MensagemConfirmarParticipacao) {
			this.ctrl.conexaoRealizada();
		}
		if(mensagem instanceof MensagemIniciarJogo) {
			Iterator<String> iterador;
			String cor;
			iterador = ((MensagemIniciarJogo) mensagem).getCores().iterator();
			while(iterador.hasNext()) {
				cor = iterador.next();
				this.ctrl.inserirPeao(cor);
				this.ctrl.moverPeao(((MensagemIniciarJogo) mensagem).getCampo(), cor);
			}
			this.ctrl.setDinheiro("" + ((MensagemIniciarJogo) mensagem).getDinheiro());
		}
		if(mensagem instanceof MensagemPermitirCompra) {
			this.ctrl.setJButtonComprar(true);
		}
		if(mensagem instanceof MensagemDados) {
			this.ctrl.mostrarDados(((MensagemDados) mensagem).getDados()[0], ((MensagemDados) mensagem).getDados()[1]);
		}
		if(mensagem instanceof MensagemDinheiro) {
			this.ctrl.setDinheiro("" + ((MensagemDinheiro) mensagem).getDinheiro());
		}
		if(mensagem instanceof MensagemPosicao) {
			this.ctrl.moverPeao(((MensagemPosicao) mensagem).getCampo(), ((MensagemPosicao) mensagem).getCor());
		}
		if(mensagem instanceof MensagemPropriedades) {
			if(((MensagemPropriedades) mensagem).getCor().equals(this.ctrl.getCorJogador())) {
				this.ctrl.insertPropriedade(((MensagemPropriedades) mensagem).getPropriedades());
			}
		}
		if(mensagem instanceof MensagemAvisoStatus) {
			this.ctrl.setAvisoStatus(((MensagemAvisoStatus) mensagem).getDescricao());
		}
		if(mensagem instanceof MensagemChat) {
			this.ctrl.receberChat(((MensagemChat) mensagem).getDescricao());
		}
		if(mensagem instanceof MensagemFimDeJogo) {
			this.ctrl.fimDeJogo();
		}		
		if(mensagem instanceof MensagemVez) {
			this.ctrl.setAvisoStatus("O Jogador "+((MensagemVez) mensagem).getCor()+" Esta na Vez");
			
			if(((MensagemVez) mensagem).getCor().equals(this.ctrl.getCorJogador())) {
				this.ctrl.setJButtonDados(true);
				this.ctrl.setJButtonTransacao(true);
				this.ctrl.setJButtonPassarVez(true);
			}
			else {
				this.ctrl.setJButtonDados(false);
				this.ctrl.setJButtonTransacao(false);
				this.ctrl.setJButtonPassarVez(false);
				this.ctrl.setJButtonComprar(false);
				//this.controladorGUI.setJogadorVez(((MensagemVez)mensagem).getCor());
			}
		}
	}
	
	@SuppressWarnings("deprecation")
	public void close() throws DestinoDesconhecidoException, IOException{
		enviar(null);
		this.threadCliente.stop();
		this.socket.close();
	}
}
